classic_battlefield_moddingfandomcom-20200214-history
Class Specific Bot Behaviors
Class Specific Bot Behaviour By '''Turbo Faflun Hi, I've used a lot of info from this forum to make my copy of BF2 a lot better game, and I think I can finally repay to you and add something myself. I hope this is something new, and I won't get a reply with a link to someone elses post explaining exactly the same thing There was a few threads with discussions about how to make bots of different classes behave differently or in a more suitable way for particular class. As they doesn't seem to give a solusion how to setup this, my post might be a good expansion of the subject. '''If you want to know if this method is worth trying see the RESULTS at the end of this post. First of all a bit of explanation. I have based my tweaks on files from AIX 2.0, as this mod seems to be the best start for tweaking th AI, simply because of its focus on this matter. I show you what I did on the example of Assault class. Don't be scared by the lenght of this post, doing all the tweaks described below took me only half an hour. Make a backup of the two files we'll be messing with, so we can get started Objects.ai IMPORTANT: In this file the AIX team have already made different AI templates for every single class. It seems that vanBf2 has only one AI template for Infantery '''in general named simply '''SoldierUnit. So if you want to apply this method to vanBF2 or a different mod, I suppose you would have to make a class specific entries in this file, like they are in AIX. In the original AIX2\Objects_server.zip\soldiers\Common\ai\Objects.ai we have: CODE rem *** assault soldierunit ** aiTemplatePlugIn.create Unit assaultSoldierUnit aiTemplatePlugIn.equipmentTypeName bInfantery/b aiTemplatePlugIn.setBattleStrength Infantry 9.0 aiTemplatePlugIn.setBattleStrength LightArmour 3.0 aiTemplatePlugIn.setBattleStrength HeavyArmour 1.0 aiTemplatePlugIn.setBattleStrength NavalArmour 0.0 aiTemplatePlugIn.setBattleStrength Helicopter 0.0 aiTemplatePlugIn.setBattleStrength AirPlane 0.0 aiTemplatePlugIn.setStrategicStrength 0 3 aiTemplatePlugIn.setStrategicStrength 1 3 aiTemplatePlugIn.cullDistance 200 We dont want our assault class soldier to be simply a generic Infantery '''as any other class is. So we change this: aiTemplatePlugIn.equipmentTypeName '''Infantery to this for instance: aiTemplatePlugIn.equipmentTypeName SoldierAssault Of course we should change equipmentTypeName for every other class specific soldier Unit '''in this file as well. So we have (in it's place): aiTemplatePlugIn.equipmentTypeName '''SoldierAssault aiTemplatePlugIn.equipmentTypeName SoldierAT aiTemplatePlugIn.equipmentTypeName SoldierEngeneer etc. Ok, that's all in Objects.ai. Save, update zip and close. AIBehaviours.ai Now open AIX2\AI\AIBehaviours.ai and look at this: CODE rem *** Set number of vehicles and id/name mappings *** aiSettings.setVehicle Tank aiSettings.setVehicle Plane aiSettings.setVehicle Boat aiSettings.setVehicle Infantery aiSettings.setVehicle Fixed aiSettings.setVehicle Car aiSettings.setVehicle LandingCraft aiSettings.setVehicle Passenger aiSettings.setVehicle LandingCraftPassenger aiSettings.setVehicle LandingCraftFixed aiSettings.setVehicle Helicopter aiSettings.setVehicle TransportHelicopter aiSettings.setVehicle ArmedCar aiSettings.setVehicle ManDown aiSettings.setVehicle ParatrooperFixed aiSettings.setVehicle Amphibian aiSettings.setVehicle Bomber aiSettings.setVehicle Gunship aiSettings.setVehicle TransportGunship aiSettings.setVehicle TransportAGMGunship aiSettings.setVehicle VTOL aiSettings.setVehicle WaterCraft aiSettings.setVehicle TransportPlane This is where you have to add your new soldier types, which apparently will become yet another types of vehicles, like Infantery '''is Add appropriate equipmentTypeName's (the ones you entered in soldiers Objects.ai) at the bottom of the "aiSettings.setVehicle" paragraph. In case of our Assault soldier it will be: aiSettings.setVehicle '''SoldierAssault After a while of typing you should have this: CODE rem *** Set number of vehicles and id/name mappings *** aiSettings.setVehicle Tank aiSettings.setVehicle Plane aiSettings.setVehicle Boat aiSettings.setVehicle Infantery aiSettings.setVehicle Fixed aiSettings.setVehicle Car aiSettings.setVehicle LandingCraft aiSettings.setVehicle Passenger aiSettings.setVehicle LandingCraftPassenger aiSettings.setVehicle LandingCraftFixed aiSettings.setVehicle Helicopter aiSettings.setVehicle TransportHelicopter aiSettings.setVehicle ArmedCar aiSettings.setVehicle ManDown aiSettings.setVehicle ParatrooperFixed aiSettings.setVehicle Amphibian aiSettings.setVehicle Bomber aiSettings.setVehicle Gunship aiSettings.setVehicle TransportGunship aiSettings.setVehicle TransportAGMGunship aiSettings.setVehicle VTOL aiSettings.setVehicle WaterCraft aiSettings.setVehicle TransportPlane aiSettings.setVehicle SoldierAssault aiSettings.setVehicle SoldierAT aiSettings.setVehicle SoldierEngeneer etc. Now, look at the next paragraph: CODE aiSettings.setVehicleClusterMapping Tank Tank aiSettings.setVehicleClusterMapping Boat LandingCraft aiSettings.setVehicleClusterMapping Infantery Infantery aiSettings.setVehicleClusterMapping Car Tank aiSettings.setVehicleClusterMapping LandingCraft LandingCraft aiSettings.setVehicleClusterMapping ArmedCar ArmedCar aiSettings.setVehicleClusterMapping Amphibian ArmedCar aiSettings.setVehicleClusterMapping WaterCraft ArmedCar Although I'm not sure, I suppose this lines tell the game to treat specific unit types as more general ones (eg. for a purpose of AI, both Boat and LandingCraft can be treated simply as LandingCraft, as well as an Amphibia, WaterCraft or any other instance of ArmedCar can be treated as a generic ArmedCar). This seems to be ment to simplify things and avoid repeats in later scripts. Although I may be wrong, by following this way of thinking we want our SoldierAssault '''to be treated (by other bots and vehicles) as simply an instance of '''Infantery. This simplifies things a lot. It's also quite reasonable - a bot in a tank don't necessarily have to care wich class he is shooting at Anyway... in a case of our assault soldier we add: aiSettings.setVehicleClusterMapping SoldierAssault Infantery So we have: CODE aiSettings.setVehicleClusterMapping Tank Tank aiSettings.setVehicleClusterMapping Boat LandingCraft aiSettings.setVehicleClusterMapping Infantery Infantery aiSettings.setVehicleClusterMapping Car Tank aiSettings.setVehicleClusterMapping LandingCraft LandingCraft aiSettings.setVehicleClusterMapping ArmedCar ArmedCar aiSettings.setVehicleClusterMapping Amphibian ArmedCar aiSettings.setVehicleClusterMapping WaterCraft ArmedCar baiSettings.setVehicleClusterMapping SoldierAssault Infantery aiSettings.setVehicleClusterMapping SoldierAT Infantery aiSettings.setVehicleClusterMapping SoldierEngeneer Infantery/b etc. Ok. After this quick setup, we can finally do something useful. Find this: CODE rem *** Construct standard weights *** aiSettings.createBehaviourModifiers StandardWeights aiSettings.setBehaviourModifier Avoid 1.0 aiSettings.setBehaviourModifier MoveTo 1.25 aiSettings.setBehaviourModifier Idle 0.01 aiSettings.setBehaviourModifier Fire 7.5 aiSettings.setBehaviourModifier Special 3.50 aiSettings.setBehaviourModifier TakeCover 2.25 aiSettings.setBehaviourModifier Change 1.9 aiSettings.setBehaviourModifier Revive 3.25 aiSettings.setBehaviourModifier c4 3.5 aiSettings.setBehaviourModifier Special2 3.25 aiSettings.setBehaviourModifier Special3 3.50 aiSettings.setBehaviourModifier Random 1.25 aiSettings.setBehaviourModifier Triggerable 1.75 In order to create a set of weights for our SoldierAssault '''unit/vehicle type, copy and paste this whole paragraph and rename this: aiSettings.createBehaviourModifiers '''StandardWeights to this: aiSettings.createBehaviourModifiers SoldierAssaultWeights Repeat this process for every class, giving each set of BehaviourModifiers a unique name. I suppose the best choice would be SoldierATWeights, SoldierEngeneerWeights, SoldierMedicWeights etc. This way we can create class specific BehaviourModifiers sets like this: CODE rem *** Construct SoldierAssault weights *** aiSettings.createBehaviourModifiers SoldierAssaultWeights aiSettings.setBehaviourModifier Avoid 1.0 aiSettings.setBehaviourModifier MoveTo 1.25 aiSettings.setBehaviourModifier Idle 0.01 aiSettings.setBehaviourModifier Fire 7.5 aiSettings.setBehaviourModifier Special 3.50 aiSettings.setBehaviourModifier TakeCover 2.25 aiSettings.setBehaviourModifier Change 1.9 aiSettings.setBehaviourModifier Revive 3.25 aiSettings.setBehaviourModifier c4 3.5 aiSettings.setBehaviourModifier Special2 3.25 aiSettings.setBehaviourModifier Special3 3.50 aiSettings.setBehaviourModifier Random 1.25 aiSettings.setBehaviourModifier Triggerable 1.75 rem *** Construct SoldierAT weights *** aiSettings.createBehaviourModifiers SoldierATWeights aiSettings.setBehaviourModifier Avoid 1.0 aiSettings.setBehaviourModifier MoveTo 1.25 aiSettings.setBehaviourModifier Idle 0.01 aiSettings.setBehaviourModifier Fire 7.5 aiSettings.setBehaviourModifier Special 3.50 aiSettings.setBehaviourModifier TakeCover 2.25 aiSettings.setBehaviourModifier Change 1.9 aiSettings.setBehaviourModifier Revive 3.25 aiSettings.setBehaviourModifier c4 3.5 aiSettings.setBehaviourModifier Special2 3.25 aiSettings.setBehaviourModifier Special3 3.50 aiSettings.setBehaviourModifier Random 1.25 aiSettings.setBehaviourModifier Triggerable 1.75 rem *** Construct SoldierEngeneer weights *** aiSettings.createBehaviourModifiers SoldierEngeneerWeights aiSettings.setBehaviourModifier Avoid 1.0 aiSettings.setBehaviourModifier MoveTo 1.25 aiSettings.setBehaviourModifier Idle 0.01 aiSettings.setBehaviourModifier Fire 7.5 aiSettings.setBehaviourModifier Special 3.50 aiSettings.setBehaviourModifier TakeCover 2.25 aiSettings.setBehaviourModifier Change 1.9 aiSettings.setBehaviourModifier Revive 3.25 aiSettings.setBehaviourModifier c4 3.5 aiSettings.setBehaviourModifier Special2 3.25 aiSettings.setBehaviourModifier Special3 3.50 aiSettings.setBehaviourModifier Random 1.25 aiSettings.setBehaviourModifier Triggerable 1.75 (etc.) Some of theese modifiers doesn't seem to be useful for every particular class (eg. c4 for a Medic or Revive for an AT). Nevertheless I think its better to leave them in every set, in case somebody would like to add for instance a c4 charge to a Medic kit In order to make this BehaviourModifiers stuff work, we have to setup the behaviours for our new soldier unit types. Look for this: CODE rem *** Infantery Behaviour setup *** aisettings.setVehicleMods Infantery StandardWeights aiSettings.setVehicleMaterialCost Infantery Ground 1 rem aiSettings.setVehicleMaterialCost Infantery Road 1 aiSettings.setVehicleMaterialCost Infantery Road 0.6 aiSettings.setVehicleMaterialCost Infantery Shallows 1.5 aiSettings.setVehicleMaterialCost Infantery DeepWater 260 rem aiSettings.setVehicleMaterialCost Infantery DeepWater -1 aiSettings.setVehicleBehaviour Infantery Avoid BBAvoid BBPAvoidCollisionInfantery 1 UCUnion AvoidInhibit aiSettings.setVehicleBehaviour Infantery MoveTo BBMoveTo BBPGotoWaypointInfantery 4 UCUnion UnitWeights aiSettings.setVehicleBehaviour Infantery Idle BBIdle BBPIdleInfantery 5 UCUnion UnitWeights aiSettings.setVehicleBehaviour Infantery Fire BBFireInfantery BBPFireInfantery 4 UCFire UnitWeights aiSettings.setVehicleBehaviour Infantery Special BBMedicAssist BBPMedicAssist 12 UCUnion UnitWeights aiSettings.setVehicleBehaviour Infantery Special2 BBBridgeRepair BBPBridgeRepair 15 UCUnion UnitWeights rem aiSettings.setVehicleBehaviour Infantery Special2 BBBridgeRepair BBPBridgeRepair 15 UCUnion UnitWeights aiSettings.setVehicleBehaviour Infantery c4 BBC4 BBPC4 12 UCUnion UnitWeights aiSettings.setVehicleBehaviour Infantery Special3 BBDefuseMines BBPDefuseMines 13 UCUnion UnitWeights aiSettings.setVehicleBehaviour Infantery Change BBChange BBPChange 6 UCUnion UnitWeights aiSettings.setVehicleBehaviour Infantery Revive BBRevive BBPRevive 8 UCUnion UnitWeights aiSettings.setVehicleBehaviour Infantery Random BBRandom BBPRandom 12 UCUnion UnitWeights aiSettings.setVehicleBehaviour Infantery Triggerable BBTriggerable BBPTriggerable 12 UCUnion UnitWeights aiSettings.setVehicleDefaultBehaviour Infantery Idle aiSettings.addInterpreterEntry Infantery MoveToMediumSoldier Medium aiSettings.addInterpreterEntry Infantery MoveToObjectMediumSoldier Medium aiSettings.addInterpreterEntry Infantery InfoWrapper aiSettings.addInterpreterEntry Infantery InfanteryMoveTo aiSettings.addInterpreterEntry Infantery InfanteryMoveToDirection aiSettings.addInterpreterEntry Infantery InfanteryMoveToObject aiSettings.addInterpreterEntry Infantery Trigger aiSettings.addInterpreterEntry Infantery TriggerContinously aiSettings.addInterpreterEntry Infantery MouseTurretAimAt aiSettings.addInterpreterEntry Infantery InfanteryResetControls aiSettings.addInterpreterEntry Infantery MouseTurretLookAt aiSettings.addInterpreterEntry Infantery Sense aiSettings.addInterpreterEntry Infantery SoldierPose aiSettings.activateDefaultInterpreter Infantery BAPSTOverrideSensingAgent Full aiSettings.activateDefaultInterpreter Infantery BAPSTPlaceC4 Full aiSettings.activateDefaultInterpreter Infantery BAPSTParallel Full aiSettings.activateDefaultInterpreter Infantery BAPSTSerial Full aiSettings.activateDefaultInterpreter Infantery BAPSTIf Full aiSettings.activateDefaultInterpreter Infantery BAPSTPlanEnd Full aiSettings.activateDefaultInterpreter Infantery BAPSTWait Full aiSettings.activateDefaultInterpreter Infantery BAPSTWhile Full aiSettings.activateDefaultInterpreter Infantery BAPSTWeaponWrapper Full aiSettings.activateDefaultInterpreter Infantery BAPSTFinishedWrapper Full aiSettings.activateDefaultInterpreter Infantery BAPSTAimingWrapper Full aiSettings.activateDefaultInterpreter Infantery BAPSTUpdateVehicle Full aiSettings.activateDefaultInterpreter Infantery BAPSTChangeWeapon Full aiSettings.activateDefaultInterpreter Infantery BAPSTICTurnLock Full aiSettings.activateDefaultInterpreter Infantery BAPSTICChangeVehicle Full aiSettings.activateDefaultInterpreter Infantery BAPSTEvaluate Full aiSettings.activateDefaultInterpreter Infantery BAPSTNotifyBot Full aiSettings.activateDefaultInterpreter Infantery BAPSTIdle Full aiSettings.activateDefaultInterpreter Infantery BAPSTSetSensingAgentFocus Full aiSettings.activateDefaultInterpreter Infantery BAPSTMergeSoldierInputs Full aiSettings.activateDefaultInterpreter Infantery BAPSTSendRadioMessage Full aiSettings.activateDefaultInterpreter Infantery BAPSTLookAtWrapper Full aiSettings.activateDefaultInterpreter Infantery BAPSTDebug Full aiSettings.activateDefaultInterpreter Infantery BAPSTForgetTarget Full aiSettings.activateDefaultInterpreter Infantery BAPSTUseFlareOnMissileLock Full aiSettings.activateDefaultInterpreter Infantery BAPSTEvaluateCondition Full aiSettings.activateDefaultInterpreter Infantery BAPSTRevive Full aiSettings.addSensingAgentPattern Infantery Soldier This bunch of things I dont really understand well, might be quite useful for later messing with bots brains. Until now, there is only one Infantery Behaviour setup for all the infantry in the game (all the classes altogether). So in order to make them class specific, we have to copy this whole paragraph seven times (seven classes) and change some values. Although you can do it manually, I suggest my method. Open new WordPad window and paste this paragraph into it. First of all, following our assault soldier example change this: aisettings.setVehicleMods Infantery StandardWeights to this: aisettings.setVehicleMods SoldierAssault SoldierAssaultWeights As you can see everything we have to setup erlier meets here. Summing up: Infantery '''unit type -> '''class specific unit type (eg. SoldierAssault, SoldierAT, SoldierEngeneer); StandardWeights '''-> '''class specific weights (eg. SoldierAssaultWeights, SoldierATWeights, SoldierEngeneerWeights). I thing you got the point. Now place the writing cursor at the very end of this newly modified line (right to the "s" from "SoldierAssaultWeights") and press CTRL+H for find and replace tool. In "Find" type "Infantery '" (without quotes and with SPACE AT THE END), and in the "Change to" type "'SoldierAssault '''" (without quotes and with SPACE AT THE END). Press "Change all" and you should get this: '''CODE rem *** SoldierAssault Behaviour setup *** aisettings.setVehicleMods SoldierAssault SoldierAssaultWeights aiSettings.setVehicleMaterialCost SoldierAssault Ground 1 rem aiSettings.setVehicleMaterialCost SoldierAssault Road 1 aiSettings.setVehicleMaterialCost SoldierAssault Road 0.6 aiSettings.setVehicleMaterialCost SoldierAssault Shallows 1.5 aiSettings.setVehicleMaterialCost SoldierAssault DeepWater 260 rem aiSettings.setVehicleMaterialCost SoldierAssault DeepWater -1 aiSettings.setVehicleBehaviour SoldierAssault Avoid BBAvoid BBPAvoidCollisionInfantery '1 UCUnion AvoidInhibit aiSettings.setVehicleBehaviour SoldierAssault MoveTo BBMoveTo '''BBPGotoWaypointInfantery '''4 UCUnion UnitWeights aiSettings.setVehicleBehaviour SoldierAssault Idle BBIdle '''BBPIdleInfantery '''5 UCUnion UnitWeights aiSettings.setVehicleBehaviour SoldierAssault Fire '''BBFireInfantery BBPFireInfantery '''4 UCFire UnitWeights aiSettings.setVehicleBehaviour SoldierAssault Special BBMedicAssist BBPMedicAssist 12 UCUnion UnitWeights aiSettings.setVehicleBehaviour SoldierAssault Special2 BBBridgeRepair BBPBridgeRepair 15 UCUnion UnitWeights rem aiSettings.setVehicleBehaviour SoldierAssault Special2 BBBridgeRepair BBPBridgeRepair 15 UCUnion UnitWeights aiSettings.setVehicleBehaviour SoldierAssault c4 BBC4 BBPC4 12 UCUnion UnitWeights aiSettings.setVehicleBehaviour SoldierAssault Special3 BBDefuseMines BBPDefuseMines 13 UCUnion UnitWeights aiSettings.setVehicleBehaviour SoldierAssault Change BBChange BBPChange 6 UCUnion UnitWeights aiSettings.setVehicleBehaviour SoldierAssault Revive BBRevive BBPRevive 8 UCUnion UnitWeights aiSettings.setVehicleBehaviour SoldierAssault Random BBRandom BBPRandom 12 UCUnion UnitWeights aiSettings.setVehicleBehaviour SoldierAssault Triggerable BBTriggerable BBPTriggerable 12 UCUnion UnitWeights aiSettings.setVehicleDefaultBehaviour SoldierAssault Idle aiSettings.addInterpreterEntry SoldierAssault MoveToMediumSoldier Medium aiSettings.addInterpreterEntry SoldierAssault MoveToObjectMediumSoldier Medium aiSettings.addInterpreterEntry SoldierAssault InfoWrapper aiSettings.addInterpreterEntry SoldierAssault '''InfanteryMoveTo ' aiSettings.addInterpreterEntry SoldierAssault '''InfanteryMoveToDirection aiSettings.addInterpreterEntry SoldierAssault InfanteryMoveToObject aiSettings.addInterpreterEntry SoldierAssault Trigger aiSettings.addInterpreterEntry SoldierAssault TriggerContinously aiSettings.addInterpreterEntry SoldierAssault MouseTurretAimAt aiSettings.addInterpreterEntry SoldierAssault InfanteryResetControls aiSettings.addInterpreterEntry SoldierAssault MouseTurretLookAt aiSettings.addInterpreterEntry SoldierAssault Sense aiSettings.addInterpreterEntry SoldierAssault SoldierPose aiSettings.activateDefaultInterpreter SoldierAssault BAPSTOverrideSensingAgent Full aiSettings.activateDefaultInterpreter SoldierAssault BAPSTPlaceC4 Full aiSettings.activateDefaultInterpreter SoldierAssault BAPSTParallel Full aiSettings.activateDefaultInterpreter SoldierAssault BAPSTSerial Full aiSettings.activateDefaultInterpreter SoldierAssault BAPSTIf Full aiSettings.activateDefaultInterpreter SoldierAssault BAPSTPlanEnd Full aiSettings.activateDefaultInterpreter SoldierAssault BAPSTWait Full aiSettings.activateDefaultInterpreter SoldierAssault BAPSTWhile Full aiSettings.activateDefaultInterpreter SoldierAssault BAPSTWeaponWrapper Full aiSettings.activateDefaultInterpreter SoldierAssault BAPSTFinishedWrapper Full aiSettings.activateDefaultInterpreter SoldierAssault BAPSTAimingWrapper Full aiSettings.activateDefaultInterpreter SoldierAssault BAPSTUpdateVehicle Full aiSettings.activateDefaultInterpreter SoldierAssault BAPSTChangeWeapon Full aiSettings.activateDefaultInterpreter SoldierAssault BAPSTICTurnLock Full aiSettings.activateDefaultInterpreter SoldierAssault BAPSTICChangeVehicle Full aiSettings.activateDefaultInterpreter SoldierAssault BAPSTEvaluate Full aiSettings.activateDefaultInterpreter SoldierAssault BAPSTNotifyBot Full aiSettings.activateDefaultInterpreter SoldierAssault BAPSTIdle Full aiSettings.activateDefaultInterpreter SoldierAssault BAPSTSetSensingAgentFocus Full aiSettings.activateDefaultInterpreter SoldierAssault BAPSTMergeSoldierInputs Full aiSettings.activateDefaultInterpreter SoldierAssault BAPSTSendRadioMessage Full aiSettings.activateDefaultInterpreter SoldierAssault BAPSTLookAtWrapper Full aiSettings.activateDefaultInterpreter SoldierAssault BAPSTDebug Full aiSettings.activateDefaultInterpreter SoldierAssault BAPSTForgetTarget Full aiSettings.activateDefaultInterpreter SoldierAssault BAPSTUseFlareOnMissileLock Full aiSettings.activateDefaultInterpreter SoldierAssault BAPSTEvaluateCondition Full aiSettings.activateDefaultInterpreter SoldierAssault BAPSTRevive Full aiSettings.addSensingAgentPattern SoldierAssault Soldier IMPORTANT: Look at the bolded parts. You have to be careful not to accidently change any of them while using "find and replace", otherwise you may get CTD. That's why the SPACE AT THE END was necessary. Now copy and paste this new SoldierAssault Behaviour setup at the end of the AIBehaviours.ai, and repeat this process for every other class. You should have seven new behaviour setups for SoldierAssault, SoldierAT, SoldierEngeneer etc. each one beginning from pointing to a class specific weights (SoldierAssaultWeights, SoldierATWeights, SoldierEngeneerWeights) as this one above. Now to the fun part... and... right... Actually, excited that my experiments concerning bots behaviour finally got me somewhere, I haven't done much testing yet. In other words the fun part is up to you. Feel free to mess up with the weights and behaviours, and observe the differences in bots behaviour. I hope it will lead you to interesting, and more realistic results, which you'll post here for everyone's amusement. Good luck! RESULTS Of course I have already done some testing to see if it works (otherwise I wouldn't bother you). I have changed some of the BehaviourModifiers values for some classes. For example, I set aiSettings.setBehaviourModifier Fire 0.0 aiSettings.setBehaviourModifier MoveTo 0.0 for all the classes but Sniper. In the result bots of other classes were standing still and not fireing at any hostile terget. Only snipers were moving to CPs and fighting. I repeated this with other class configs and it worked. By leaving Fire above zero, given classes started to fire, but still not moving unless MoveTo was also set above zero and so on. Although this results aren't very practical, seemed to prove this method is working or at least worth further testing. I suppose any other, less dramatic tweaks will also have an impact on bots, and will help to improve their behaviour "classwise". For instanse I changed aiSettings.setBehaviourModifier TakeCover in SoldierSupportWeights, to see support soldiers avoiding being shot at better. An explanation of things in Behaviour setup, which is now also class specific, might give us additional possibilities. I haven't messed with it, because I simply don't uderstand this "BleBle BBIdle BBPIdleInfantery BleBle 5 UCUnion UnitWeights BleBle" stuff I hope someone more experienced with BF2 AI will find all this worth to experiment with, to make our BF2 SP even better.